package com.blumov.fastbox.application.services.mock.compra;

import com.blumov.fastbox.application.services.compra.PedidoService;
import com.blumov.fastbox.domain.model.compra.ItemPedido;
import com.blumov.fastbox.domain.model.compra.Pedido;
import com.blumov.fastbox.domain.model.compra.PedidoId;
import com.blumov.fastbox.domain.model.compra.PedidoRepository;
import com.blumov.fastbox.domain.model.compra.enums.EstadoTransaccion;

public final class PedidoServiceMockImpl implements PedidoService {

	private PedidoRepository pedidoRepository;


	public PedidoId crear() {
		return new PedidoId("5852");
	}

	public void agregarItem(final PedidoId pedidoId, final ItemPedido itemPedido) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.agregarItem(itemPedido);
		pedidoRepository.store(pedido);
	}

	public void agregarBandeja(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.agregarBandeja();
		pedidoRepository.store(pedido);
	}

	public void seleccionarBandejaAnterior(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.seleccionarBandejaAnterior();
		pedidoRepository.store(pedido);
	}

	public void seleccionarBandejaSiguiente(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.seleccionarBandejaSiguiente();
		pedidoRepository.store(pedido);
	}

	public Integer cantidadDeBandejas(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		return pedido.cantidadDeBandejas();
	}

	public Integer indiceBandejaActiva(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		return pedido.indiceBandejaActiva();
	}
	
	public void cocinar(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.cambiarEstado(EstadoTransaccion.PENDIENTE);
		pedidoRepository.store(pedido);
	}
	
	public void confirmarPedidoEntregado(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.cambiarEstado(EstadoTransaccion.ENTREGADO);
		pedidoRepository.store(pedido);
	}
	
	public Pedido damePedido() {
		Pedido pedido = pedidoRepository.traerSiguientePedido();
		if (pedido == null) {
			// Si no hay otro pedido en espera se devuelve un pedido vacio.
			return new Pedido(new PedidoId(""));
		}
		pedido.cambiarEstado(EstadoTransaccion.PREPARANDO);
		pedidoRepository.store(pedido);
		return pedido;
	}
	
	public void enviarACocina(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.cambiarEstado(EstadoTransaccion.COCINANDO);
		pedidoRepository.store(pedido);
	}
	
	public void pedidoCancelado(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.cambiarEstado(EstadoTransaccion.CANCELADO);
		pedidoRepository.store(pedido);
	}
	
	public void pedidoListo(PedidoId pedidoId) {
		final Pedido pedido = pedidoRepository.find(pedidoId);
		pedido.cambiarEstado(EstadoTransaccion.LISTO);
		pedidoRepository.store(pedido);
	}
	
	// Getters & setters
	
	public void setPedidoRepository(PedidoRepository pedidoRepository) {
		this.pedidoRepository = pedidoRepository;
	}
}
